//	COPYRIGHT (C) 1981 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

//	COPYRIGHT (C) 1981 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

STATIC $( LIBDEV = NIL; LIBFNAME = NIL; LIBFEXT = NIL $);

STATIC $( LIBIDS = [TABLE 8,"MYLIB",1,"GENLIB",2,"ISOLIB",3,"BMTERP",4,
                   "BSTERP",5,"TSTERP",6,"SURVLIB",7,"AMNACD",8,0];
          LIBDEVS = [TABLE 8,0,0,0,0,0,0,0,0];
          LIBFNAMES = [TABLE 8,0,"CONGEN","ISOPRE","BMTERP","BSTERP","TSTERP",
                      "SURV","AMNACD"];
          LIBFEXTS = [TABLE 8,0,"LIB","LIB","LIB","LIB","LIB","LIB","LIB"];
          LIBOPTS = "GENLIB ISOLIB BMTERP BSTERP TSTERP AMNACD SURVLIB MYLIB" $);

LET STROFSIXBIT(SIXBWORD) = VALOF
 $( STATIC $( CHARS = VEC 6; NCH = NIL; STR = VEC 6; CH = NIL $);
 NCH:=0;
 FOR I=30 TO 0 BY -6 DO
  $(
  NCH+:=1;
  CHARS!NCH:=[SIXBWORD>>I] BITAND #77
  $);
 WHILE CHARS!NCH=0 DO NCH-:=1;
 FOR I=1 TO NCH DO CHARS!I+:=#40;
 CHARS!0:=NCH;
 PACKSTRING(CHARS,STR);
 RESULTIS STR
 $);

LET LIBLOC(PROMPT,QQSTR) = VALOF
 $( STATIC $( LIB = NIL $);
 TRYPROMPT:
 LIB:=PROMPTSELECT(PROMPT,LIBOPTS,0,QQSTR,LIBIDS,FALSE];
 SWITCHON LIB INTO
  $(
  CASE 0: RESULTIS FALSE;
  CASE 1:
   GETFILE:
   UNLESS PROMPTFORFILE("NAME OF A FILE YOU HAVE PREVIOUSLY SAVED:",QQSTR) DO
    RESULTIS FALSE;
   UNLESS ISSAVEFILE(PROMPTFILENAME,PROMPTFILEEXT) DO GOTO GETFILE;
   LIBDEV:="DSK";
   LIBFNAME:=PROMPTFILENAME;
   LIBFEXT:=PROMPTFILEEXT;
   LIBPPN:=0;
   RESULTIS TRUE;
  DEFAULT:
   LIBDEV:=LIBDEVS!LIB;
   IF LIBDEV=0 DO LIBDEV:=STROFSIXBIT(MAKDEV);
   LIBFNAME:=LIBFNAMES!LIB;
   LIBFEXT:=LIBFEXTS!LIB;
   RESULTIS TRUE
  $)
 $);

LET SHOWLIB(QQSTR) BE
 $( STATIC $( OIN = NIL; NAME = NIL; NAMESIZE = NIL; POS = NIL; NOUT = NIL $)
 MANIFEST $( RMAR = 72 $);
 UNLESS LIBLOC("LIBRARY TO BE SHOWN:",QQSTR) DO RETURN;
 OIN:=INPUT;
 SWAPLITEMS();
 INPUT:=FINDFILE(LIBDEV,LIBFNAME,LIBFEXT,LIBPPN);
 FINDSEG(CHUNKSEP,ESHEADSTR);
 NOUT:=0;
 DEFLOOP:
 SKIPSEG(ESSEP);
 LINEIN("");
 UNLESS NEXTIS(EOLTYPE) DO
  $(
  NAME:=LOPITEM();
  LINEIN("");
  IF STREQUAL(STROFNUM(LOPITEM()),"SUBSTRUCTURE") DO
   $(
   NOUT:=NOUT+1;
   IF NOUT=1 DO
    $(
    OUTS("THAT LIBRARY CONTAINS THE FOLLOWING SUBSTRUCTURES:*C*L");
    POS:=0
    $);
   NAMESIZE:=NCHARS(STROFNUM(NAME))+NCHARSN(NOUT)+1;
   IF POS+NAMESIZE>RMAR DO $( NEWLINE(1); POS:=0 $);
   OUTNO(NOUT);
   OUTCH(')');
   OUTSNUM(NAME);
   SPACES(1);
   POS:=POS+NAMESIZE+1
   $);
  GOTO DEFLOOP
  $);
 TEST NOUT=0 THEN OUTS("THAT FILE HAS NO SUBSTRUCTURES IN IT*C*L")
 OR NEWLINE(1);
 SWAPLITEMS();
 ENDREAD(INPUT);
 INPUT:=OIN
 $);

LET SEARCH() BE
 $( STATIC $( OIN = NIL; OOUT = NIL; SOUGHT = NIL; COPIED = NIL;
              SUBNAME = NIL; LIBNAME = NIL; SSSTR = NIL $);

 LET ADDSSSTR(TAIL) BE FRPLACA(TAIL,LIST(CAR(TAIL),SSSTR));

 UNLESS LIBLOC("LIBRARY TO BE SEARCHED:","SEARCH-HELP") DO RETURN;
 SOUGHT:=@NULL;
 TRYPROMPT:
 SUBNAME:=DEFNAMEIN("SUBSTRUCTURE TO BE RETRIEVED:","SEARCH-HELP",0);
 IF SUBNAME NE 0 DO
  $(
  IF FMEMB(SUBNAME,SOUGHT)=@NULL DO SOUGHT:=CONS(SUBNAME,SOUGHT);
  UNLESS NEXTIS(EOLTYPE) DO GOTO TRYPROMPT
  $);
 IF SOUGHT=@NULL DO RETURN;
 COPIED:=@NULL;
 SSSTR:=NUMOFSTR("SUBSTRUCTURE");
 OIN:=INPUT;
 OOUT:=OUTPUT;
 SWAPLITEMS();
 INPUT:=FINDFILE("DSK",TOPFILENAME(),CGEXT);
 OUTPUT:=CREATEFILE("DSK",SC1FILENAME(),CGEXT);
 COPYSEGSTO(CHUNKSEP,ESHEADSTR,TRUE);
 COPYSEGSTO(ESSEP,"",TRUE);
 ENDREAD(INPUT);
 INPUT:=FINDFILE(LIBDEV,LIBFNAME,LIBFEXT,LIBPPN);
 FINDSEG(CHUNKSEP,ESHEADSTR);
 SKIPSEG(ESSEP);
 LIBLOOP:
 LINEIN("");
 UNLESS NEXTIS(EOLTYPE) DO
  $(
  LIBNAME:=LOPITEM();
  LINEIN("");
  TEST [LOPITEM()=SSSTR] BITAND [FMEMB(LIBNAME,SOUGHT) NE @NULL] THEN
   $(
   SOUGHT:=DREMOVE(LIBNAME,SOUGHT);
   COPIED:=CONS(LIBNAME,COPIED);
   OUTSNUM(LIBNAME);
   OUTS("*C*LSUBSTRUCTURE*C*L");
   COPYSEG(ESSEP,TRUE)
   $)
  OR SKIPSEG(ESSEP);
  GOTO LIBLOOP
  $);
 NEWLINE(1);
 OUTCH(CHUNKSEP);
 NEWLINE(1);
 ENDREAD(INPUT);
 INPUT:=OIN;
 ENDWRITE(OUTPUT);
 OUTPUT:=OOUT;
 SWAPLITEMS();
 SOUGHT:=DREVERSE(SOUGHT);
 IF SOUGHT NE @NULL DO
  PLIST(SOUGHT,OUTSNUM,"THAT LIBRARY DOESN'T CONTAIN ",", "," OR ","*C*L");
 UNLIST(SOUGHT);
 IF COPIED=@NULL DO RETURN;
 INTERRUPTABLE(FALSE);
 FILEREPLACE(TOPFILENAME(),CGEXT,SC1FILENAME(),CGEXT);
 PLIST(COPIED,OUTSNUM,"",", "," AND "," DEFINED*C*L");
 MAP(COPIED,ADDSSSTR);
 ALLDEFS:=NCONC(ALLDEFS,COPIED);
 INTERRUPTABLE(TRUE)
 $);
